package com.yupi.springbootinit.model.dto.processsheet;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 工艺单创建请求
 */
@Data
public class ProcessSheetAddRequest implements Serializable {

    /**
     * 来源类型：1-销售订单，2-研发订单
     */
    private Integer sourceType;

    /**
     * 来源订单号
     */
    private String sourceNo;

    /**
     * 来源订单ID（String类型）
     */
    private String sourceId;

    /**
     * 工艺单号（通常自动生成，不含版本后缀）
     */
    private String processSheetNo;

    // ========== 工艺单级别字段 ==========

    /**
     * 材料牌号（料粉型号）
     */
    private String materialBrand;

    /**
     * 材料规格
     */
    private String materialSpec;

    /**
     * 粉末厂家
     */
    private String powderSupplier;

    /**
     * 计划版次数量（前端输入，后端自动统计实际批次数）
     */
    private Integer plannedBatchCount;

    /**
     * 需求日期
     */
    private LocalDateTime dueDate;

    /**
     * 整体技术要求
     */
    private String technicalRequirements;

    /**
     * 工艺文件附件ID列表，逗号分隔
     */
    private String processFileIds;

    /**
     * 设备名称（对应device_info.device_name）
     */
    private String deviceName;

    /**
     * 生产设备ID
     */
    private String deviceId;

    /**
     * 设备编码
     */
    private String deviceCode;

    /**
     * 工艺版次（默认A）
     */
    private String processVersion;

    /**
     * 客户名称（从订单带出）
     */
    private String customerName;

    // ========== 产品明细 ==========

    /**
     * 产品明细列表（从订单带出后补充零件图号和单件重量）
     */
    private List<ProductDetailRequest> products;

    // ========== 工序明细 ==========

    /**
     * 工序明细
     */
    private List<ProcessSheetStepAddRequest> steps;

    // ========== 版次计划（必填） ==========

    /**
     * 版次计划列表
     */
    private List<BatchPlanRequest> batches;

    // ==================== 内部类 ====================

    /**
     * 产品明细请求
     */
    @Data
    public static class ProductDetailRequest implements Serializable {
        /**
         * 产品ID（修改时使用）
         */
        private String id;

        /**
         * 订单明细ID
         */
        private String orderItemId;

        /**
         * 产品料号（只读）
         */
        private String productCode;

        /**
         * 产品名称（只读）
         */
        private String productName;

        /**
         * 规格型号（只读）
         */
        private String specification;

        /**
         * 订单数量（只读）
         */
        private Integer quantity;

        /**
         * 零件图号（工程部手动填写）
         */
        private String partDrawingNo;

        /**
         * 单件重量（g，工程部手动填写）
         */
        private BigDecimal unitWeight;

        /**
         * 产品高度（mm，工程部手动填写）
         */
        private BigDecimal productHeight;

        /**
         * 排序号
         */
        private Integer sortOrder;
    }

    /**
     * 工序步骤请求
     */
    @Data
    public static class ProcessSheetStepAddRequest implements Serializable {
        private Integer sequenceNo;
        private String operationId;

        @JsonProperty("operation_name")
        @JsonAlias({"operationName"})
        private String operationName;

        private Integer isInspectionRequired;
        private String inspectionMethod;
        private String inspectionCriteria;
        private Integer isOutsourced;
        private String processRequirement;
    }

    /**
     * 版次计划请求
     */
    @Data
    public static class BatchPlanRequest implements Serializable {
        /**
         * 版次序号
         */
        private Integer batchNo;



        /**
         * 批次产品列表
         */
        @NotEmpty(message = "批次产品列表不能为空")
        private List<BatchProductRequest> products;

    }

    /**
     * 版次产品请求
     */
    @Data
    public static class BatchProductRequest implements Serializable {
        /**
         * 产品ID（process_sheet_product.id）
         */
        private String productId;

        /**
         * 产品料号（冗余）
         */
        private String productCode;

        /**
         * 产品名称（冗余）
         */
        private String productName;

        /**
         * 本批次生产数量
         */
        private Integer productionQuantity;

    }

    private static final long serialVersionUID = 1L;
}